package com.hw01.utils;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.google.common.collect.Lists;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CodeGeneration {

    public static void main(String[] args) {

        // 表名
        List<String> tables = Lists.newArrayList("employee"
                , "employee_workloads", "organization", "payrolls", "punching_card_record"
                , "task_allocation");

        // mpp的表查询
        DataSourceConfig.Builder dataSourceBuilder =
                new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/hw01",
                        "mysql", "123456").dbQuery(new MySqlQuery());

        FastAutoGenerator.create(dataSourceBuilder).globalConfig(builder -> {
            builder.author("zhong")//生成的作者名字
                    //.enableSwagger()开启swagger，需要添加swagger依赖并配置
                    .dateType(DateType.TIME_PACK)//时间策略
                    .commentDate("yyyy-MM-dd")//格式化时间格式
                    .disableOpenDir()//禁止打开输出目录，默认false
                    .fileOverride()//覆盖生成文件
                    .build();
        }).packageConfig(builder -> {
            String projectPath = System.getProperty("user.dir"); //获取项目路径
            String filePath = projectPath + "/src/main/java/com/hw01";  //java下的文件路径

            Map<OutputFile, String> genfileMap = new HashMap<>();
            genfileMap.put(OutputFile.xml, filePath + "/" + "mapper");
            genfileMap.put(OutputFile.entity, filePath + "/" + "entity");
            genfileMap.put(OutputFile.service, filePath + "/" + "service");
            genfileMap.put(OutputFile.serviceImpl, filePath + "/" + "service/impl");
            genfileMap.put(OutputFile.mapper, filePath + "/" + "mapper");

            builder.entity("entity")//实体类包名
                    .moduleName("").parent("com.hw01")//父包名。如果为空，将下面子包名必须写全部， 否则就只需写子包名
//                            .controller("controller")//控制层包名
                    .mapper("mapper")//mapper层包名
                    .xml("mapper.xml")//数据访问层xml包名
                    .service("service")//service层包名
                    .serviceImpl("service.impl")//service实现类包名
                    .pathInfo(genfileMap); //路径配置信息,就是配置各个文件模板的路径信息,这里以mapper.xml为例
        }).strategyConfig(builder -> {
            builder.addInclude(tables)//添加表匹配，指定要生成的数据表名，不写默认选定数据库所有表
                    //.disableSqlFilter()禁用sql过滤:默认(不使用该方法）true
                    //.enableSchema()启用schema:默认false

                    .entityBuilder() //实体策略配置
                    //.disableSerialVersionUID()禁用生成SerialVersionUID：默认true
                    .enableChainModel()//开启链式模型
                    .enableLombok()//开启lombok
                    .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀
                    .enableTableFieldAnnotation()//开启生成实体时生成字段注解
                    //.addTableFills()添加表字段填充
                    .naming(NamingStrategy.underline_to_camel)//数据表映射实体命名策略：默认下划线转驼峰underline_to_camel
                    .columnNaming(NamingStrategy.underline_to_camel)//表字段映射实体属性命名规则：默认null，不指定按照naming执行
                    .idType(IdType.INPUT)//添加全局主键类型
                    .formatFileName("%s")//格式化实体名称，%s取消首字母I
//                            .build()

                    .mapperBuilder()//mapper文件策略
                    .enableMapperAnnotation()//开启mapper注解
                    .enableBaseResultMap()//启用xml文件中的BaseResultMap 生成
                    .enableBaseColumnList()//启用xml文件中的BaseColumnList
                    //.cache(缓存类.class)设置缓存实现类
                    .formatMapperFileName("%sMapper")//格式化Dao类名称
                    .formatXmlFileName("%sMapper")//格式化xml文件名称
//                            .build()

                    .serviceBuilder()//service文件策略
                    .formatServiceFileName("%sService")//格式化 service 接口文件名称
                    .formatServiceImplFileName("%sServiceImpl")//格式化 service 接口文件名称
//                            .build()
                    /*
                    .controllerBuilder()//控制层策略
                    //.enableHyphenStyle()开启驼峰转连字符，默认：false
                    .enableRestStyle()//开启生成@RestController
                    .formatFileName("%sController")//格式化文件名称
                    */
                    ;
        }).execute();


    }

}
